/**
 * strategy-pattern 策略模式：
 * 
 * 官方定义：定义一些算法，把他们封装起来，并且可以相互替换。
 *         【就是把看似毫无关联的代码提取封装、复用、使之更容易理解和拓展。】
 * 
 *         常见的用于一次if判断、switch枚举、数据字典等流程判断语句中
 */

/**
 * 使用策略模式计算等级
 * 
 *   在游戏中，我们没玩儿完一局游戏都有对用户进行等级评价。
 *   比如S级4倍经验，A级3倍经验，B级2倍经验，其他1倍经验，用函数来表达如下
 */

function getExperience(level, experience) {
    if (level === "S") {
        return 4 * experience
    } else if (level === "A") {
        return 3 * experience
    } else if (level === "B") {
        return 2 * experience
    } else { 
        return experience
    }
}

// console.log("B的经验值：", getExperience("B", 200))

/**
 * getExperience函数各种if条件判断。复用性差。可以用策略模式封装复用的思想，进行改写
 */

const strategy = {
    "S" : function(experience) {
        return 4 * experience
    },
    "A" : function(experience) {
        return 3 * experience
    },
    "B" : function(experience) {
        return 2 * experience
    }
}

/**
 * getExperience可以复用
 * @param {*} strategy 
 * @param {*} level 
 * @param {*} experience 
 * @returns 
 */
function getExperience(strategy, level, experience) { 
    return (level in strategy) ? strategy[level](experience) : experience
}

//console.log("S级的经验值：", getExperience(strategy, "S", 200))
//console.log("A级的经验值：", getExperience(strategy, "A", 200))

/**
 * 分为两个函数之后， strategy对象解耦， 扩展性强。
 * 
 * 在 vue 的数据驱动试图更新器 update使用，就使用了策略模式。
 */

/**
 * 指令处理集合
 */
/** 
var compileUtil = {
    // v-text
    text: function(node, vm, exp) {
        this.bind(node, vm, exp, 'text')
    },
    // v-html
    html: function (node, vm, exp) {
        this.bind(node, vm, exp, 'html')
    },
    class: function (node, vm, exp) {
        this.bind(node, vm, exp, 'class')
    },
    bind: function (node, vm, exp, dir) { 
        //不同指令触发试图更新
        var updateFn = update[dir + "Updater"]
        updateFn && updateFn(node, this.__getVMVal(vm, val))
        new Watcher(vm, exp, function(value, oldValue) {
            updateFn && updateFn(node, value, oldValue)
        })
    }
}
*/

/**
 * 使用策略模式进行表单验证
 */